package zeus.controller;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.model.SelectItem;
import javax.inject.Inject;
import javax.inject.Named;

import zeus.converter.SimpleIndexConverter;
import zeus.exception.EntidadeException;
import zeus.model.Consumivel;
import zeus.model.Estadia;
import zeus.model.Extra;
import zeus.model.Quarto;
import zeus.model.StatusQuarto;
import zeus.model.TipoConsumivel;
import zeus.model.TipoExtra;
import zeus.service.EjbEstadiaService;
import zeus.service.EjbQuartoService;

@Named("estadiaAction")
@RequestScoped
public class EstadiaAction {

	@EJB
	EjbQuartoService quartoService;
	
	@EJB
	EjbEstadiaService estadiaService;
	
	@Inject
	ResumoEstadia resumoEstadia;

	private Map<String, Consumivel> consumiveis;
	private List<Consumivel> consumiveisList = new ArrayList<Consumivel>();
	
	private Map<String, Extra> extras;
	private List<Extra> extrasList = new ArrayList<Extra>();

	private int numeroQuarto;
	
	private Estadia estadia = new Estadia();
	
	public EstadiaAction(){
		this.carregarConsumiveis();
		this.carregarExtras();
	}

	public String inicia() {
		new EstadiaAction();
		return "/checkout.xhtml";
	}
	

	private void carregarConsumiveis() {
		this.consumiveis = new HashMap<String, Consumivel>();
		this.consumiveis.put("Refrigerante Coca-Cola", new Consumivel(3,
				TipoConsumivel.REFRIGERANTE_COCA, "Refrigerante Coca-Cola"));
		this.consumiveis.put("Água", new Consumivel(2.5, TipoConsumivel.AGUA,
				"Água"));
		this.consumiveis.put("Cerveja", new Consumivel(3.5,
				TipoConsumivel.CERVEJA, "Cerveja"));
		this.consumiveis.put("Vinho", new Consumivel(45, TipoConsumivel.VINHO,
				"Vinho"));
		this.consumiveis.put("Champanhe", new Consumivel(95,
				TipoConsumivel.CHAMPANHE, "Champanhe"));
		this.consumiveis.put("Chocolate", new Consumivel(15,
				TipoConsumivel.CHOCOLATE, "Chocolate"));
		
	}
	
	private void carregarExtras() {
		this.extras = new HashMap<String, Extra>();
		this.extras.put("Café da Manha", new Extra(11,
				TipoExtra.CAFE_DA_MANHA, "Café da Manha"));
		this.extras.put("Almoço", new Extra(15, TipoExtra.ALMOCO,
				"Almoço"));
		this.extras.put("Lavanderia", new Extra(40,
				TipoExtra.LAVANDERIA, "Lavanderia"));
		this.extras.put("Aparelho de Barbear", new Extra(45, TipoExtra.APARELHO_DE_BARBEAR,
				"Aparelho de Barbear"));
		this.extras.put("Escovas e Creme Dental", new Extra(10,
				TipoExtra.ESCOVAS_E_CREME_DENTAL, "Escovas e Creme Dental"));
		this.extras.put("Toalhas", new Extra(15,
				TipoExtra.TOALHAS, "Toalhas"));
		this.extras.put("Internet", new Extra(10,
				TipoExtra.INTERNET, "Internet"));
		this.extras.put("Cofre", new Extra(5,
				TipoExtra.COFRE, "Cofre"));
		this.extras.put("Estacionamento", new Extra(30,
				TipoExtra.ESTACIONAMENTO, "Estacionamento"));
		
	}
	
	public int getNumeroQuarto() {
		return numeroQuarto;
	}


	public void setNumeroQuarto(int numeroQuarto) {
		this.numeroQuarto = numeroQuarto;
	}


	public Map<String, Consumivel> getConsumiveis() {
		return consumiveis;
	}

	public void setConsumiveis(Map<String, Consumivel> consumiveis) {
		this.consumiveis = consumiveis;
	}

	public List<Consumivel> getConsumiveisList() {
		return consumiveisList;
	}

	public void setConsumiveisList(List<Consumivel> consumiveisList) {
		this.consumiveisList = consumiveisList;
	}

	public Map<String, Extra> getExtras() {
		return extras;
	}

	public void setExtras(Map<String, Extra> extras) {
		this.extras = extras;
	}

	public List<Extra> getExtrasList() {
		return extrasList;
	}

	public void setExtrasList(List<Extra> extrasList) {
		this.extrasList = extrasList;
	}

	
	public Converter getConverter(){
		return new SimpleIndexConverter();
	}
	
	public String salvarEstadia(){
		
		Quarto quarto;
		try {
			quarto = quartoService.buscarQuartoPorNumero(numeroQuarto);
			estadia.setQuarto(quarto);
			estadia.setHospede(quarto.getHospede());
			
			double valorTotal = 0;
			
			for(Consumivel c : consumiveisList){
				valorTotal += c.getPreco();
				estadia.getConsumiveis().add(c);
			}
			
			for(Extra e : extrasList){
				valorTotal += e.getPreco();
				estadia.getExtras().add(e);
			}
			
			Date dataAtual =  Calendar.getInstance().getTime();
			long difEmMsegs = quarto.getHorarioSaida().getTime() - quarto.getHorarioEntrada().getTime();  
			
			if(!(quarto.getHorarioEntrada().compareTo(dataAtual) == 0)){
				quarto.setSaiuAntes(true);
				quarto.setHorarioSaida(dataAtual);
				
			}
			
			quarto.setStatusQuarto(StatusQuarto.LIVRE);
			quartoService.atualizar(quarto);
			
			int difEmDias = (int) ((difEmMsegs/1000)/3600)/24;  
			
			double valorDiarias = quarto.getPreco() * difEmDias;
			valorTotal += valorDiarias;
			
			estadia.setValorTotal(valorTotal);
			
			estadiaService.salvarEstadia(estadia);
			
			FacesMessage cadastro = new FacesMessage(FacesMessage.SEVERITY_INFO, 
					"Estadia Registrada","Check-out Realizado, Volte Sempre!");
				FacesContext.getCurrentInstance().addMessage(null, cadastro);
				
			return resumoEstadia.inicia(estadia, difEmDias);	
			
		} catch (EntidadeException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		return "";
	

	}
	
	public List<SelectItem> listarQuartosOcupados(){
		List<SelectItem> listaQuartosDesocupados = new ArrayList<SelectItem>();
		
		for (Quarto q : quartoService.listarQuartos()) {
			if(q.getStatusQuarto().equals(StatusQuarto.OCUPADO))
				listaQuartosDesocupados.add(new SelectItem(q.getNumero(), q.getTipoQuarto().getNome() + " - N: " + String.valueOf(q.getNumero())));
	    }
		
		 return listaQuartosDesocupados;
	}

	public Estadia getEstadia() {
		return estadia;
	}

	public void setEstadia(Estadia estadia) {
		this.estadia = estadia;
	}

}
